package com.rd.server.modules.sse.controller;

import cn.hutool.core.map.MapUtil;
import com.rd.common.exception.BusinessException;
import com.rd.common.model.Result;
import com.rd.server.modules.room.model.RoomPO;
import com.rd.server.modules.room.service.RoomService;
import com.rd.server.modules.sse.service.SseService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.Map;
import java.util.Objects;

/**
 * SSE控制器
 * 处理服务器发送事件(Server-Sent Events)相关的请求
 * 实现实时消息推送和房间管理功能
 */
@Slf4j
@RestController
@RequestMapping("/sse")
public class SseController {

    @Resource
    private SseService sseService;

    @Resource
    private RoomService roomService;

    /**
     * 发送心跳包
     * 客户端定期调用此接口保持SSE连接活跃
     *
     * @return 操作结果
     * @apiNote 建议客户端每10-15秒调用一次此接口
     */
    @PostMapping("/heartbeat")
    public Result<String> sendHeartbeat() {
        try {
            sseService.sendHeartbeat();
            return Result.success("心跳发送成功");
        } catch (Exception e) {
            log.error("发送心跳失败", e);
            return Result.error("心跳发送失败");
        }
    }

    /**
     * 建立SSE连接
     * 客户端通过此接口建立与服务器的长连接，用于接收实时消息
     *
     * @return SseEmitter SSE连接对象
     * @apiNote 客户端需要定期发送心跳包保持连接
     */
    @GetMapping(value = "/connect", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter connect() {
        return sseService.connect();
    }

    /**
     * 加入房间
     * 将用户添加到指定房间，并通知房间内其他用户
     *
     * @param params 房间ID
     * @apiNote 如果用户已在其他房间，会自动离开原房间
     */
    @PostMapping("/join-room")
    public Object joinRoom(@RequestBody Map<String, Object> params) {
        String roomId = MapUtil.getStr(params, "roomId");
        if (Objects.isNull(roomId)) {
            throw new BusinessException("房间号不能为空");
        }
        RoomPO room = roomService.getById(roomId);
        if (Objects.isNull(room) || room.getStatus() == 1) {
            // 房间不存在创建房间
            throw new BusinessException("房间不存在或已结算");
        }
        sseService.joinRoom(roomId);
        return Result.success();
    }

    /**
     * 离开房间
     * 将用户从当前房间移除，并通知房间内其他用户
     *
     * @apiNote 如果用户不在任何房间中，此操作将被忽略
     */
    @PostMapping("/leave-room")
    public Object leaveRoom() {
        sseService.leaveRoom();
        return Result.success();
    }

    /**
     * 发送消息
     * 向用户所在房间的所有成员广播消息
     *
     * @param params 消息内容
     * @apiNote 如果发送者不在任何房间中，消息将被丢弃
     */
//    @PostMapping("/send-message")
//    public Result<String> sendMessage(@RequestBody Map<String,Object> params) {
//        String message = MapUtil.getStr(params, "message");
//        String userId = StpUtil.getLoginIdAsString();
//        String roomId = USER_ROOMS.get(userId);
//        if (roomId != null) {
//            broadcastToRoom(roomId, userId + ": " + message);
//        }
//        return Result.success();
//    }


}